home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / dev / c / agl103p.lha / src / agl / clip.c < prev    next >
C/C++ Source or Header  |  1994-12-08  |  4KB  |  172 lines

  1. /******************************************************************************
  2.  
  3. Copyright © 1994 Jason Weber
  4. All Rights Reserved
  5.  
  6. $Id: clip.c,v 1.2.1.3 1994/12/09 05:29:56 jason Exp $
  7.  
  8. $Log: clip.c,v $
  9.  * Revision 1.2.1.3  1994/12/09  05:29:56  jason
  10.  * added copyright
  11.  *
  12.  * Revision 1.2.1.2  1994/11/16  06:23:56  jason
  13.  * separate calls to activate/deactivate clipping for specific windows
  14.  *
  15.  * Revision 1.2.1.1  1994/09/13  03:47:14  jason
  16.  * debugged and tested
  17.  *
  18.  * Revision 1.2  1994/08/24  04:19:39  jason
  19.  * original revision
  20.  *
  21.  
  22. ******************************************************************************/
  23.  
  24.  
  25. #ifndef NOT_EXTERN
  26. #include"agl.h"
  27. #endif
  28.  
  29.  
  30. short ClipLimits[MAX_WINDOWS][4];
  31.  
  32.  
  33. /******************************************************************************
  34. void    scrmask(Screencoord left,Screencoord right,
  35.                                             Screencoord bottom,Screencoord top)
  36.  
  37. ******************************************************************************/
  38. /*PROTOTYPE*/
  39. void scrmask(Screencoord left,Screencoord right,Screencoord bottom,Screencoord top)
  40.     {
  41.     ClipLimits[CurrentWid][0]=left;
  42.     ClipLimits[CurrentWid][1]=right;
  43.     ClipLimits[CurrentWid][2]=top;
  44.     ClipLimits[CurrentWid][3]=bottom;
  45.  
  46.     if(!Bordered[CurrentWid] && left==0 && right==CurrentWidth-1 && bottom==0 && top==CurrentHeight-1)
  47.         Clipped[CurrentWid]=FALSE;
  48.     else
  49.         Clipped[CurrentWid]=TRUE;
  50.  
  51.     activate_clipping(CurrentWid);
  52.     }
  53.  
  54.  
  55.  
  56. /******************************************************************************
  57. void    getscrmask(Screencoord *left,Screencoord *right,
  58.                                         Screencoord *bottom,Screencoord *top)
  59.  
  60. ******************************************************************************/
  61. /*PROTOTYPE*/
  62. void getscrmask(Screencoord *left,Screencoord *right,Screencoord *bottom,Screencoord *top)
  63.     {
  64.     *left=        ClipLimits[CurrentWid][0];
  65.     *right=        ClipLimits[CurrentWid][1];
  66.     *top=        ClipLimits[CurrentWid][2];
  67.     *bottom=    ClipLimits[CurrentWid][3];
  68.     }
  69.  
  70.  
  71. /******************************************************************************
  72. void    activate_clipping(long wid)
  73.  
  74.     activates clipping in current window
  75. ******************************************************************************/
  76. /*PROTOTYPE*/
  77. void activate_clipping(long wid)
  78.     {
  79.     struct Region *old_region;
  80.  
  81.     Screencoord left,right,bottom,top;
  82.  
  83.     long y1,y2;
  84.  
  85.     if(Clipped[wid])
  86.         {
  87.         getscrmask(&left,&right,&bottom,&top);
  88.  
  89.         y1=CurrentHeight-top-1;
  90.         y2=CurrentHeight-bottom-1;
  91.  
  92.         if(Bordered[wid])
  93.             {
  94.             left+=BorderWidth;
  95.             right+=BorderWidth;
  96.  
  97.             y1+=BorderWidth+BorderHeight;
  98.             y2+=BorderWidth+BorderHeight;
  99.             }
  100.  
  101.         if( (old_region=clip_window(GLWindow[wid],(long)left,y1,(long)right,y2)) != NULL )
  102.             DisposeRegion(old_region);
  103.         }
  104.     else
  105.         unclip_window(GLWindow[wid]);
  106.     }
  107.  
  108.  
  109. /******************************************************************************
  110. void    deactivate_clipping(long wid)
  111.  
  112.     activates clipping in current window
  113. ******************************************************************************/
  114. /*PROTOTYPE*/
  115. void deactivate_clipping(long wid)
  116.     {
  117.     unclip_window(GLWindow[wid]);
  118.     }
  119.  
  120.  
  121. /******************************************************************************
  122. void    unclip_window(struct Window *window)
  123.  
  124.     install NULL region
  125.     dispose of old region, if one existed
  126.  
  127. ******************************************************************************/
  128. /*PROTOTYPE*/
  129. void unclip_window(struct Window *window)
  130.     {
  131.     struct Region *old_region;
  132.  
  133.     if( (old_region=InstallClipRegion(window->WLayer,NULL)) != NULL )
  134.         DisposeRegion(old_region);
  135.     }
  136.  
  137.  
  138. /******************************************************************************
  139. struct Region *clip_window(struct Window *window,
  140.                                     long minx,long miny,long maxx,long maxy)
  141.  
  142.     clip window to given bounds
  143.     return old region, if one existed
  144.  
  145. ******************************************************************************/
  146. /*PROTOTYPE*/
  147. struct Region *clip_window(struct Window *window,long minx,long miny,long maxx,long maxy)
  148.     {
  149.     struct Region *new_region;
  150.     struct Rectangle rectangle;
  151.  
  152.     rectangle.MinX=minx;
  153.     rectangle.MinY=miny;
  154.     rectangle.MaxX=maxx;
  155.     rectangle.MaxY=maxy;
  156.  
  157.     if( (new_region=NewRegion()) != NULL )
  158.         {
  159.         if( OrRectRegion(new_region,&rectangle) == FALSE )
  160.             {
  161.             printf("Error setting clipping region\n");
  162.  
  163.             DisposeRegion(new_region);
  164.             new_region=NULL;
  165.             }
  166.         }
  167.     else
  168.         printf("Error creating clipping region\n");
  169.  
  170.     return(InstallClipRegion(window->WLayer,new_region));
  171.     }
  172.